public class Test1 {
    //leetcode 123 买卖股票的最佳时机 III
    public int maxProfit(int[] prices) {
        //状态表示，如果按照之前的做法来表示就是f[i]表示第i天以买入状态为结尾，获得到的最大的利润，g[i]
        //表示第i天以卖出状态为结尾获得到的最大的利润，但是由于还有买卖次数的限制，所以一维表无法准确的表示处当前状态
        int n = prices.length;
        int[][] f = new int[n][3];
        int[][] g = new int[n][3];
        int INF = 0x3f3f3f3f;
        for (int i = 0; i < 3; i++) {
            f[0][i] = g[0][i] = -INF;
        }
        f[0][0] = -prices[0];
        g[0][0] = 0;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < 3; j++) {
                f[i][j] = Math.max(f[i-1][j],g[i-1][j] - prices[i]);
                if (j-1 >= 0) {
                    g[i][j] = Math.max(g[i-1][j],f[i-1][j-1] + prices[i]);
                }
            }
        }
        int ret = 0;
        for (int i = 0; i < 3; i++) ret = Math.max(g[n-1][i],ret);
        return ret;
    }
}
